const { spawn } = require('child_process');
const path = require('path');
const CPLUSPLUS_EXECUTABLE_PATH = path.join(__dirname, '..', 'grpc_server', 'FileTransGRPCServer.exe');
// 配置项
const EXECUTION_OPTIONS = {
  windowsHide: true, // 隐藏运行子进程(spawn启动的进程不会衍生shell)
  detached: true, // 让子进程独立于父进程运行
};

let childProcess;
function startCPlusPlusService() {
  childProcess = spawn(CPLUSPLUS_EXECUTABLE_PATH, [], EXECUTION_OPTIONS, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error starting C++ service: ${error}`);
      return;
    }
    console.log(`C++ service stdout: ${stdout}`);
    console.error(`C++ service stderr: ${stderr}`);
  });
}

function stopCPlusPlusService() {
  console.log(childProcess.pid)
  /**
   * 注意：想要关闭启动的进程，必须使用 spawn 来创建子进程，
   *      使用 exec 创建子进程无法使用 kill 方法关闭子进程：
   *      因为 exec 创建子进程的实例实际上不是子进程，而是套壳进程，
   *      无法获取子进程的 pid，而是在子进程的外部套壳，获取的是套壳进程的 pid
   */
  /**
   * @param 1. childProcess.exitCode 标识子进程的退出代码。如果子进程仍在运行，则返回 null
   * @param 2. childProcess.kill() 通过 Kill 方法来关闭子进程
   */
  if (childProcess.exitCode === null) {
    childProcess.kill();
    console.log('Attempting to gracefully shut down the C++ service...');
  } else {
    console.log('C++ service has already exited.');
  }
}
module.exports = { startCPlusPlusService, stopCPlusPlusService };
